
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>JVM如何判断那个对象是垃圾 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>JVM如何判断那个对象是垃圾 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">引用计数算法是如何判断一个对象是否为垃圾的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">每个对象都带有一个引用计数器，用于记录其被引用的次数。当这个计数器的值变为0时，就意味着该对象不再被任何地方引用，可以被当作垃圾进行回收。</div>
          </div>
          <div class="card-source">来源: 1、引用计数算法（Reference Counting Algorithm）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">引用计数算法存在什么主要缺陷？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">引用计数算法无法解决对象之间的循环引用问题。如果两个或多个对象相互引用，即使它们已经没有来自外部的引用，它们的引用计数器也永远不会变为0，导致这些对象无法被回收。</div>
          </div>
          <div class="card-source">来源: 1、引用计数算法（Reference Counting Algorithm）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Java虚拟机主要使用的可达性分析算法是如何工作的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">该算法从一系列称为“GC Roots”的根对象开始，向下搜索并遍历所有通过引用链（Reference Chain）连接的对象。如果一个对象到任何GC Roots之间都没有引用链相连，那么这个对象就被判定为不可达，即是需要回收的垃圾。</div>
          </div>
          <div class="card-source">来源: 2、可达性分析算法（Reachability Analysis Algorithm）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在可达性分析算法中，哪些对象可以作为GC Roots？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">GC Roots通常包括：1. 虚拟机栈（栈帧中的本地变量表）中引用的对象；2. 方法区中静态属性引用的对象；3. 方法区中常量引用的对象；4. 本地方法栈中（Native方法）引用的对象。</div>
          </div>
          <div class="card-source">来源: 2、可达性分析算法（Reachability Analysis Algorithm）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">引用队列算法（Reference Queue）的主要作用是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">引用队列算法允许开发者在对象被垃圾回收时执行一些额外的操作，例如发送通知、释放相关资源或进行清理工作。这在缓存系统等场景中非常有用，可以及时清理无效数据。</div>
          </div>
          <div class="card-source">来源: 3、引用队列算法（Reference Queue Algorithm）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">引用队列算法通常与哪几种特殊类型的引用对象配合使用？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">引用队列算法配合软引用（SoftReference）、弱引用（WeakReference）和虚引用（PhantomReference）等特殊类型的引用对象使用。</div>
          </div>
          <div class="card-source">来源: 3、引用队列算法（Reference Queue Algorithm）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">当一个设置了引用队列的对象变为不可达时，会发生什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当一个设置了引用队列的对象变为不可达状态时，它所关联的引用对象（如WeakReference实例）会被加入到与之关联的引用队列中。垃圾回收器可以后续处理这个队列，从而触发相应的清理操作。</div>
          </div>
          <div class="card-source">来源: 3、引用队列算法（Reference Queue Algorithm）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">相比引用计数算法，可达性分析算法的核心优势是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">可达性分析算法的核心优势在于它能够准确地解决引用计数算法无法处理的循环引用问题，从而更精确地判断对象是否可达并进行回收。</div>
          </div>
          <div class="card-source">来源: 2、可达性分析算法（Reachability Analysis Algorithm）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">文档中关于引用队列的示例代码为何要调用 `System.gc()` 和 `Thread.sleep()`？这在实际开发中是推荐的做法吗？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">调用 `System.gc()` 是为了尝试主动触发垃圾回收，而 `Thread.sleep()` 是为了等待垃圾回收线程有时间执行。文档明确指出，这不保证GC会立即执行，在实际开发中不应过于依赖手动调用 `System.gc()`，而应让JVM自行管理对象的回收。</div>
          </div>
          <div class="card-source">来源: 3、引用队列算法（Reference Queue Algorithm）</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
